<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="keywords" content="spring,Spring,java,web,Hystrix,断路器,程序员,博客,IT,技术,移动开发,Web前端,企业架构,编程语言,互联网,数据库,技术博客,blog,分布式架构,分布式">
		<meta name="description" content="cdcoder是一个程序员学习交流平台，深度IT技术博客，移动开发博客,Web前端博客,企业架构博客,编程语言博客,互联网博客,数据库博客,IT blog,核心关注IT知识传播，共享。为更好的IT产业贡献一份微薄的力量。">
		<link rel="shortcut icon" href="/img/code.ico" />
		<link rel="bookmark" href="/img/code.ico" />
		<title>框架个分布式相关知识</title>
		<link href="../css/index.css" rel="stylesheet">
		<style>
			body {
				font-size: 16px;
				font: 400 16px/1.62 Georgia, "Xin Gothic", "Hiragino Sans GB", "Droid Sans Fallback", "Microsoft YaHei", sans-serif;
				font-family: 'PT serif', 微軟正黑體, 微软雅黑, 华文细黑, Microsoft Yahei, Hiragino Sans GB, sans-serif;
				color: #D0CCCC;

				text-shadow: 0px 0px 1px rgba(24, 22, 22, 0.35);
				background-color: #000;
				
			}
			p{ text-indent:2em; padding:0px; margin:0px; }
			.box ul li { text-indent:4em; padding:0px; margin:0px; }
		</style>
	</head>
	<body>

		<header>
			<div class="logo"><a href="/index.html">徐思润博客</a></div>
			<nav>
				<ul id="starlist">
					<li><a href="/java/index.html">java</a></li>
					<li><a href="/data/index.html">算法与数据结构</a></li>
					<li><a href="/db/mysql.html">数据库</a></li>
					<li><a href="/distribution/index.html">分布式</a></li>
					<li><a href="/framework/index.html">架构</a></li>
					<li><a href="/interview/index.html">面试与被面试</a></li>
					<li><a href="/live/index.html">日常生活</a></li>
					<li><a href="/about.html">关于我</a></li>
					<li><a href="/baby/index.html">baby墙</a></li>
				</ul>
			</nav>
		</header>
		<div class="box">
			<h1 style="text-align: center;">断路器的原理与实现</h1>
			<h2>什么是Hystrix</h2>
			<p> 在分布式环境中，许多服务依赖项中的一些不可避免地会失败。Hystrix是一个库，可通过添加<a href='http://'>延迟容错</a>和<a href='http://'>容错逻辑</a>来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点，阻止它们之间的级联故障以及提供后备选项来实现这一目标，所有这些都可以提高系统的整体弹性。</p>
			<h2>Hystrix 的由来</h2>
			<p> 复杂分布式体系结构中的应用程序具有许多依赖关系，每个依赖关系在某些时候都将不可避免地失败。如果主机应用程序未与这些外部故障隔离，则可能会被它们取下。</p>
			<p>例如，对于依赖于30个服务的应用程序，其中每个服务的正常运行时间为99.99％，您可以期待以下内容：</p>
			<blockquote>
				<p>99.99 30 = 99.7％正常运行时间10
					％请求中的0.3％= 3,000,000次故障2个
					小时停机/月，即使所有依赖项都具有出色的正常运行时间。</p>
			</blockquote>
			<p>现实情况通常更糟。</p>
			<p>即使所有依赖项都表现良好，<strong>如果您没有为整个系统设计弹性</strong>，那么即使0.01％停机时间对数十种服务中的每项服务的总体影响也相当于每月停机时间可能达到数小时。</p>
			<p>由此netflix团队推出了Hystrix 来解决这些问题</p>
			<p>Hystrix 能为我们带来以下优势：</p>
			<ul>
				<li>1.通过第三方客户端库访问（通常通过网络）依赖关系，以防止和控制延迟和故障。</li>
				<li>2.在复杂的分布式系统中停止级联故障。</li>
				<li>3.快速失败并迅速恢复。</li>
				<li>4.在可能的情况下，后退并优雅地降级。</li>
				<li>5.实现近实时监控，警报和操作控制。</li>
			</ul>
			<h2>Hystrix如何实现其目标？</h2>
			<p>Hystrix通过以下方式实现：</p>
			<ul>
				<li>1.将对外部系统（或“依赖项”）的所有调用包含在通常在单独线程中执行的对象<code>HystrixCommand</code>或<code>HystrixObservableCommand</code>对象中（这是<a
					 href='https://www.runoob.com/design-pattern/command-pattern.html'>命令模式</a>的示例）。</li>
				<li>2.定时调用的时间超过您定义的阈值。有一个默认的，而是由“属性”的方式对大多数依赖你自定义设置这些超时，使它们比测量的99.5略高日每个依存性百分性能。</li>
				<li>3.为每个依赖项维护一个小的线程池（或信号量）; 如果它变满，将立即拒绝发往该依赖项的请求而不是排队。</li>
				<li>4.衡量成功，失败（客户端引发的异常），超时和线程拒绝。</li>
				<li>5.如果服务的错误百分比超过阈值，则手动或自动地使断路器跳闸以停止对特定服务的所有请求一段时间。</li>
				<li>6.当请求失败时执行回退逻辑，被拒绝，超时或短路。</li>
				<li>7.近乎实时地监控指标和配置更改。</li>
			</ul>
			<h2>Hystrix提供的功能应用</h2>
			<h3>断路器(Circuit Breaker)</h3>
			<p> 用于提供熔断降级的功能，控制是否可以放弃对依赖服务的请求，并收集当前服务对依赖服务的请求结果，然后做出统计和计算。</p>
			<h3>隔离机制</h3>
			<p>
				利用线程池或型号量机制提供依赖服务的隔离，每个依赖服务都是使用独立的线程池，这样的好处是某个依赖服务发生故障时，对当前系统的影响限制在当前的线程池内部，不会影响对其他依赖服务的请求，代价就是当前服务中创建了很多线程池，线程上下文切换的开销很大，对地延迟的调用有比较大的影响。使用型号量机制去控制针对某个依赖服务的并发访问情况，这样的隔离就不需要创建线程池了，但是型号量方式无法处理依赖服务的请求响应时间变化</p>
			<h3>请求聚合</h3>
			<p> 利用HystrixCollapser 将前端多个请求聚合成一个请求发送到后端，这样可以提高系统的TPS</p>
			<h3>请求缓存</h3>
			<p> HystrixCommand和HystrixObservableCommand实现了对请求的缓存，主要是增对相同的上下文的服务依赖的请求缓存，要实现夸上下文的请求缓存需要更改很多，类似于以前单服务的缓存@Chache</p>
			<p>关于Hystrix的工作流程大家可以去参考<a href='https://github.com/Netflix/Hystrix/wiki' target='_blank' class='url'>https://github.com/Netflix/Hystrix/wiki</a></p>
			<h3>Hystrix选择时的考虑：</h3>
			<p> 目前更新不太频繁，很稳定</p>
			<p> 页面控制面板和管理后台非常的薄弱，需要使用者自定义开发一些使用起来才方便</p>
			<p> </p>
			<p>&nbsp;</p>

		</div>
		<footer>
			<p>Design by <a href="http://cdcoder.cn" target="_blank">徐思润个人博客</a> </p>
			<p>备案号：<a href="/">蜀ICP备15014105号-1</a></p>
			<script type="text/javascript" src="https://s96.cnzz.com/z_stat.php?id=1277229191&web_id=1277229191"></script>
		</footer>

	</body>
</html>
